// 配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes'
import store from '@/store'

// 使用路由插件
Vue.use(VueRouter)
// 引入路由组件

const originalPush = VueRouter.prototype.push
const originalReplace = VueRouter.prototype.replace
// VueRouter.prototype.push = function push(location) {
//   return originalPush.call(this, location).catch(err => err)
// }
VueRouter.prototype.replace = function replace(location) {
  return originalReplace.call(this, location).catch(err => err)
}
// 第一个参数，告诉原来的push方法，往哪里调
// resolve：成功的回调
// reject：失败的回调
// call与apaly :都可以调用函数一次，都可以篡改上下文一次
VueRouter.prototype.push = function (location,resolve,reject){
  if(resolve && reject){
    // originalPush() //这是错误的写法,这样改变了this，此时指向window
    originalPush.call(this,location,resolve,reject)
  }else{
    originalPush.call(this,location,()=>{},()=>{})
  }
}
//对外暴露VueRouter类的实例
let router = new VueRouter({
  //配置路由
  //第一:路径的前面需要有/(不是二级路由)
  //路径中单词都是小写的
  //component右侧V别给我加单引号【字符串：组件是对象（VueComponent类的实例）】
  routes,
  //滚动行为
  scrollBehavior(to, from, savedPosition) {
    //返回的这个y=0，代表的滚动条在最上方
    return { y: 0 };
  },
});
// 全局守卫
router.beforeEach(async(to, from, next) => {
  // to：要去哪
  // from：从哪来
  // next 放行 next(path) 放行到指定组件
  //  next() //全部放行
  // 空对象永远为真
  const name = store.state.user.userInfo.name
  const token = store.state.user.token
  // 登录的判断条件是否拥有token
  if(token){
    // 登录了
    // 登录之后就不能去登录页面 以及注册页面,并让其返回首页
    if(to.path=='/login' || to.path=='/register'){
      next('/home')
    }else{
      // 登录了去的是非登录以及非注册页面 要看看是谁进的页面，要有用户信息
      if(name){
        // 如果登录了并有用户信息，放行
        next()
      }else{
        // 如果没有用户信息，通过token获取，得到用户信息后放行
        try{
          await store.dispatch('getUserInfo')
          next()
        }catch(error){
          // 没有用户信息，token存在但是由于时间过长导致token失效。
          // 这个情况就有将要退出登录
          await store.dispatch('userLogout')
          next('/login')
        }
      }
    }

  }else{
    // 未登录 
    let toPath = to.path
    if(toPath.indexOf('/trade')!= -1|| toPath.indexOf('/center')!= -1 || toPath.indexOf('/shopcart')!= -1){
      // next('/login')
      next('/login?redirect='+toPath)
    }else{
      next();
    }
  }

})
export default router;